package org.example;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.*;
import org.checkerframework.checker.units.qual.min;

import java.io.*;
import java.util.ArrayList;

public class TEST4 {
    public static void main(String[] args) throws IOException {

        ArrayList<DataExcel> dataExcels = new ArrayList<>();

        //读取excel
        try (FileInputStream fis = new FileInputStream(new File("datanew.xlsx"));
             Workbook workbook = new XSSFWorkbook(fis)) {

            // 获取第一个工作表（sheet），索引从0开始
            Sheet sheet = workbook.getSheetAt(0);

            // 遍历每一行（Row）
            int i= 0;

            for (Row row : sheet) {
                if (i==0){
                    i++;
                    continue;
                }

                ArrayList<String> strings = new ArrayList<>();
                // 遍历每一列（Cell）
                for (Cell cell : row) {
                    // 根据Cell的类型获取值
                    String cellValue = "";
                    switch (cell.getCellType()) {
                        case STRING:
                            cellValue = cell.getStringCellValue();
                            break;
                        case NUMERIC:
                            // 注意：Excel中的日期也被存储为数字
                            if (DateUtil.isCellDateFormatted(cell)) {
                                cellValue = cell.getDateCellValue().toString();
                                //Sun Dec 31 12:30:00 CST 1899  只要 12:30
                                cellValue = cellValue.substring(11, 16);
                            } else {
                                double numericCellValue = cell.getNumericCellValue();
                                //double 转 string
                                cellValue = String.valueOf(numericCellValue);
                                //如果是 .0 结尾的，去掉
                                if (cellValue.endsWith(".0")) {
                                    cellValue = cellValue.substring(0, cellValue.length() - 2);
                                }
                            }
                            break;
                        case BOOLEAN:
                            cellValue = String.valueOf(cell.getBooleanCellValue());
                            break;
                        case FORMULA:
                            cellValue = cell.getCellFormula();
                            break;
                        case BLANK:
                            cellValue = "";
                            break;
                        default:
                            cellValue = "未知类型";
                    }
                    // 输出单元格的值，这里简单地在同一行输出，实际使用时可能需要格式化
                    strings.add(cellValue);
                }
                //arrayList转 字符串数组
                String[] strings1 = strings.toArray(new String[0]);
                DataExcel dataExcel = new DataExcel();

//                private String id;//序号
                dataExcel.setId(strings1[0]);
//                private String date;//日期
                dataExcel.setDate(strings1[1]);
//                private String time;//具体时间
                dataExcel.setTime(strings1[2]);
//                private String interviewee;//面谈对象
                dataExcel.setInterviewee(strings1[3]);
//                private String caseNumber;//个案编号
                dataExcel.setCaseNumber(strings1[4]);
//                private String abbreviation;//简称
                dataExcel.setAbbreviation(strings1[5]);
//                private String interviewContent;//面谈内容
                dataExcel.setInterviewContent(strings1[6]);
//                private String interviewDuration;//面谈时长（min）
                dataExcel.setInterviewDuration(strings1[7]);
//                private String feedbackToHeadTeacher;//是否反馈班主任
                dataExcel.setFeedbackToHeadTeacher(strings1[8]);
//                private String highRisk;//是否高危
                dataExcel.setHighRisk(strings1[9]);
//                private String reportVisit;//是否上报回访
                dataExcel.setReportVisit(strings1[10]);
//                private String caseRecord;//是否个案记录
                dataExcel.setCaseRecord(strings1[11]);
//                private String interviewTheme;//面谈主题
                dataExcel.setInterviewTheme(strings1[12]);


                dataExcels.add(dataExcel);

                // 每输出完一行后换行
//                System.out.println();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }


        for (DataExcel dataExcel : dataExcels) {
            // 加载模板文件
            FileInputStream fis = new FileInputStream("tem.docx");
            XWPFDocument document = new XWPFDocument(fis);

            // 假设我们要替换第一个表格中的数据
            XWPFTable table = document.getTables().get(0); // 获取第一个表格

            // 遍历表格的行和列
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    // 遍历单元格中的段落
                    for (XWPFParagraph paragraph : cell.getParagraphs()) {
                        // 遍历段落中的文本运行
                        for (XWPFRun run : paragraph.getRuns()) {
                            String text = run.getText(0);
                            if (text != null && text.contains("{{1}}")) {
                                // 替换占位符
                                text = text.replace("{{1}}", dataExcel.getId());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{2}}")) {
                                // 替换占位符
                                text = text.replace("{{2}}", dataExcel.getInterviewee());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }


                            if (text != null && text.contains("{{3}}")) {
                                // 替换占位符
                                text = text.replace("{{3}}", dataExcel.getInterviewDuration());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{4}}")) {
                                // 替换占位符
                                text = text.replace("{{4}}", dataExcel.getReportVisit());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{5}}")) {
                                // 替换占位符
                                text = text.replace("{{5}}", dataExcel.getDate());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{6}}")) {
                                // 替换占位符
                                text = text.replace("{{6}}", dataExcel.getCaseNumber());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{7}}")) {
                                // 替换占位符
                                text = text.replace("{{7}}", dataExcel.getFeedbackToHeadTeacher());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{8}}")) {
                                // 替换占位符
                                text = text.replace("{{8}}", dataExcel.getCaseRecord());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{9}}")) {
                                // 替换占位符
                                text = text.replace("{{9}}", dataExcel.getTime());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{10}}")) {
                                // 替换占位符
                                text = text.replace("{{10}}", dataExcel.getAbbreviation());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{11}}")) {
                                // 替换占位符
                                text = text.replace("{{11}}", dataExcel.getHighRisk());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{12}}")) {
                                // 替换占位符
                                text = text.replace("{{12}}", dataExcel.getInterviewTheme());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }

                            if (text != null && text.contains("{{13}}")) {
                                // 替换占位符
                                text = text.replace("{{13}}", dataExcel.getInterviewContent());
                                // 注意：这里不能直接设置run的文本，因为可能包含其他格式或样式
                                // 一种方法是清除run的内容并重新添加文本和样式
                                run.setText("", 0); // 清除文本
                                run.setText(text); // 添加新文本
                            }


                        }
                    }
                }
            }



            // 保存新文件
            FileOutputStream out = new FileOutputStream(dataExcel.getId()+".docx");
            document.write(out);
            out.close();
            fis.close();
            document.close();
        }





    }

}
